home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 1: Comms & Networking / Almathera Ten on Ten - Disc 1: Comms & Networking.iso / amiga-useful / multiuser / xpasswd / xpasswd.asm < prev    next >
Assembly Source File  |  1994-12-12  |  4KB  |  216 lines

  1. ; Simultaneous change of password in MultiUser and UserGroup environments
  2. ; (c) 1994 Martin Mares, MJSoft System Software
  3.  
  4. ;DEBUG    equ    1
  5. SYSI    equ    1
  6. _GlobVec    equ    1
  7.  
  8.     include    "ssmac.h"
  9.     include    "misc/usergroup.i"
  10.  
  11.     clistart
  12.  
  13.     moveq    #0,d0
  14.     call    multiuser,muGetTaskOwner
  15.     dtl    <No one logged in>,a0
  16.     move.l    d0,d7                ; D7=userid
  17.     bne.s    OK1
  18. ExitErr    jump    ss,ExitError
  19.  
  20. InsMem    jump    ss,ReportError
  21.  
  22. OK1    call    muAllocUserInfo
  23.     put.l    d0,userinfo
  24.     beq.s    InsMem
  25.     move.l    d0,a3                ; A3=UserInfo
  26.     dv.l    userinfo
  27.  
  28.     move.l    d0,a0
  29.     move.l    d7,muui_uid(a0)
  30.     moveq    #muKeyType_uid,d0
  31.     call    muGetUserInfo
  32.     dtl    <Cannot determine who is logged in>,a0
  33.     tst.l    d0
  34.     beq.s    ExitErr
  35.  
  36.     move.l    a3,a1
  37.     call    usergroup,getpwnam
  38.     dtl    <User not present in usergroup passwd file>,a0
  39.     tst.l    d0
  40.     beq.s    ExitErr
  41.     move.l    d0,a4            ; A4=usergroup passwd record
  42.  
  43.     moveq    #1,d2
  44.     bsr    setconmode
  45.     dtl    <Unable to set console raw mode>,a0
  46.     tst.l    d0
  47. ExitErr1eq    beq.s    ExitErr
  48.  
  49.     dtl    <Enter old>,a0
  50.     dbuf    passw1,32
  51.     geta    passw1,a2
  52.     clr.l    -(sp)
  53.     push    a2
  54.     pea    muT_Password
  55.     bsr    Password
  56.     move.l    sp,a0
  57.     call    multiuser,muCheckPasswd
  58.     lea    12(sp),sp
  59.     dtl    <Incorrect password>,a0
  60.     tst.l    d0
  61. ExitErr2eq    beq.s    ExitErr1eq
  62.  
  63.     dtl    <Enter new>,a0
  64.     dbuf    passw2,32
  65.     geta    passw2,a2
  66.     bsr    Password
  67.     dtl    <Retype new>,a0
  68.     dbuf    passw3,32
  69.     geta    passw3,a2
  70.     bsr    Password
  71.  
  72.     geta    passw2,a6
  73.     geta    passw3,a1
  74.     dtl    <Passwords don''t match>,a0
  75. cmpit    cmp.b    (a6)+,(a1)+
  76. ExitErr1ne    bne    ExitErr
  77.     tst.b    -1(a6)
  78.     bne.s    cmpit
  79.  
  80.     dtl    <Passwords must be at least six characters long>,a0
  81.     cmp.b    #6,d4
  82.     bcs.s    ExitErr1ne
  83.     geta    passw2,a0
  84.     moveq    #0,d1
  85.     moveq    #0,d2
  86. test1    move.b    (a0)+,d0
  87.     beq.s    test2
  88.     cmp.b    #'A',d0
  89.     bcs.s    testok
  90.     cmp.b    #'Z'+1,d0
  91.     bcs.s    testup
  92.     cmp.b    #'a',d0
  93.     bcs.s    testok
  94.     cmp.b    #'z'+1,d0
  95.     bcc.s    testok
  96.     moveq    #-1,d1
  97.     bra.s    test1
  98. testup    moveq    #-1,d2
  99.     bra.s    test1
  100. test2    dtl    <Passwords must contain mixed case or at least one non-alpha character>,a0
  101.     and.l    d1,d2
  102. ExitErr3eq    beq.s    ExitErr2eq
  103.  
  104. testok    geta    passw1,a0
  105.     geta    passw2,a1
  106.     call    multiuser,muPasswd
  107.     dtl    <Password change failed>,a0
  108.     tst.l    d0
  109.     beq.s    ExitErr3eq
  110.  
  111. blabla    move.l    a4,a0
  112.     geta    passw3,a1
  113.     moveq    #16,d0
  114.     call    usergroup,ug_GetSalt
  115.     dtl    <ug_GetSalt failed>,a0
  116.     tst.l    d0
  117.     beq.s    ExitErr3eq
  118.  
  119.     geta    passw2,a0
  120.     geta    passw3,a1
  121.     call    crypt
  122.     move.l    d0,pw_passwd(a4)
  123.  
  124.     dtl    <netinfo.device>,a0
  125.     sub.l    a1,a1
  126.     sub.l    a2,a2
  127.     moveq    #0,d0
  128.     moveq    #0,d1
  129.     call    ss,TrackDevice
  130.     move.l    a1,a3
  131.     move.l    d1,d4
  132.     move.w    #CMD_WRITE,IO_COMMAND(a1)
  133.     move.l    a4,IO_DATA(a1)
  134.     dtl    <Netinfo.device CMD_WRITE failed>,a0
  135.     move.l    d4,a1
  136.     call    ChkDoIO
  137.     move.w    #CMD_UPDATE,IO_COMMAND(a3)
  138.     dtl    <Netinfo.device CMD_UPDATE failed>,a0
  139.     move.l    d4,a1
  140.     call    ChkDoIO
  141.  
  142.     moveq    #0,d2
  143.     bsr.s    setconmode
  144.     dtl    <Password changed.>,a0
  145.     jump    PutsNL
  146.  
  147. setconmode    get.l    stdin,d1
  148.     jump    dos,SetMode
  149.  
  150. cleanup    moveq    #0,d2
  151.     bsr.s    setconmode
  152.     get.l    userinfo,a0
  153.     jump    multiuser,muFreeUserInfo
  154.  
  155. Password    call    ss,Puts
  156.     dtl    < password: >,a0
  157.     call    Puts
  158.     get.l    stdout,d1
  159.     call    dos,Flush
  160.  
  161.     moveq    #0,d4
  162. Passw1    get.l    stdin,d1
  163.     move.l    a2,d2
  164.     moveq    #1,d3
  165.     call    Read
  166.     dtl    <Stdin EOF>,a0
  167.     tst.l    d0
  168.     ble    ExitErr
  169.     move.b    (a2),d0
  170.     cmp.b    #13,d0
  171.     beq.s    Passwe
  172.     cmp.b    #10,d0
  173.     beq.s    Passwe
  174.     cmp.b    #8,d0
  175.     beq.s    Passwdel
  176.     cmp.b    #127,d0
  177.     beq.s    Passwdel
  178.     cmp.b    #31,d4
  179.     beq.s    Passw1
  180.     addq.l    #1,a2
  181.     addq.l    #1,d4
  182.     dtl.c    <*>,a0
  183.     moveq    #1,d3
  184. Passwp    move.l    a0,d2
  185.     get.l    stdout,d1
  186.     call    Write
  187.     bra.s    Passw1
  188.  
  189. Passwdel    tst.w    d4
  190.     beq.s    Passw1
  191.     subq.w    #1,d4
  192.     subq.l    #1,a2
  193.     dtl.c    <',8,' ',8,'>,a0
  194.     moveq    #3,d3
  195.     bra.s    Passwp
  196.  
  197. Passwe    clr.b    (a2)
  198.     dtl    <',13,'>,a0
  199.     jump    ss,PutsNL
  200.  
  201.     dc.b    '$VER: XPasswd 1.0 (12.12.94) '
  202.     dc.b    '© 1994 Martin Mares, MJSoft System Software',0
  203.  
  204.     tags
  205.     library    multiuser,39
  206.     dv.l    usergroupbase
  207.  
  208.     dc.w    sst_library
  209.     dc.b    'AmiTCP:libs/usergroup.library',0
  210.     even
  211.     dc.w    4,usergroupbase
  212.  
  213.     exitrout cleanup
  214.     finish
  215.     end
  216.